/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Example_13_Loading_Order.java]
 * Creation Date        [24-Jun-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_02_oop;

/**
 * 类加载顺序测试
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Example_13_Loading_Order {

	/**
	 * 测试方法
	 * 
	 * @param args
	 *            命令行参数
	 */
	public static void main(String[] args) {

		// 加载顺序:
		// 父类的静态代码块--->父类的静态属性--->子类的静态代码块--->子类的静态属性--->
		// 父类的初始化块--->父类的构造方法 --->子类的初始化块--->子类的构造方法
		// 对于静态的部分, 按照声明的先后顺序进行加载
		@SuppressWarnings("unused")
		ChildClass childClass = new ChildClass();

		// 静态代码块为何只会执行一次: 因为其是在类加载的时执行, 而每个类只会被加载一次
	}

}

/**
 * 父类
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 */
@SuppressWarnings("unused")
class ParentClass {

	private final int s = 50;

	static {
		System.out.println("Parent static block...");
	}

	private static int ss = getNext(99);

	{
		System.out.println("Parent initial block...");
	}

	/**
	 * 构造方法
	 */
	public ParentClass() {
		System.out.println("Parent constructor...");
	}

	/**
	 * 获得下一个数字的值
	 * 
	 * @param base
	 *            基础数字
	 * @return 下一个数字的值
	 */
	public static int getNext(int base) {
		System.out.println("Parent static parameter initialized...");
		return ++base;
	}
}

/**
 * 子类
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 */
@SuppressWarnings("unused")
class ChildClass extends ParentClass {

	private final int c = 100;

	static {
		System.out.println("Child static block...");
	}

	private static int cc = getNext(99);

	{
		System.out.println("Child initial block...");
	}

	/**
	 * 构造方法
	 */
	public ChildClass() {
		System.out.println("Child constructor...");
	}

	/**
	 * 获得下一个数字
	 * 
	 * @param base
	 *            基础数字
	 * @return 下一个数字的值
	 */
	public static int getNext(int base) {
		System.out.println("Child static parameter initialized...");
		return ++base;
	}
}
